/*
  一组具有相同名字，不同参数列表的和返回值无关并且具有一个实现签名和一个或多个重载签名的函数
*/

type Message = {
  id: number;
  type: MessageType;
  sendmessage: string;
};

enum MessageType {
  "Image" = "Image",
  "Audio" = "Audio",
  "Message" = "Message",
}

let message: Message[] = [
  {
    id: 1,
    type: MessageType.Message,
    sendmessage: "你好啊，今晚咱们一起出三里屯吧，",
  },
  {
    id: 2,
    type: MessageType.Message,
    sendmessage: "朝辞白帝彩云间，千里江陵一日还。",
  },
  {
    id: 3,
    type: MessageType.Audio,
    sendmessage: "你好！张无忌",
  },
  {
    id: 4,
    type: MessageType.Audio,
    sendmessage: "刘老根苦练舞台绝技！",
  },
  {
    id: 5,
    type: MessageType.Image,
    sendmessage: "今晚王牌对王牌节目咋样？",
  },
];

// 函数重载签名
function searchMsg(condition: MessageType): Message[];
function searchMsg(condition: number): Message | undefined;

// 函数重载签名实现
function searchMsg(
  condition: MessageType | number
): Message | undefined | Message[] {
  if (typeof condition === "number") {
    // 根据id查询
    return message.find((o) => o.id === condition);
  } else {
    // 根据type类型查找
    return message.filter((o) => o.type === condition);
  }
}

// 函数重载签名有更好的类型提示
console.log(searchMsg(1)?.id);
searchMsg(MessageType.Image).forEach((o) => {
  console.log(o);
});

export {};
